package multiplex.dataaccess.teste;

import java.util.Calendar;
import java.util.List;

import multiplex.dataaccess.dao.FilmeDao;
import multiplex.dataaccess.dao.LocalizacaoDao;
import multiplex.dataaccess.dao.SalaDao;
import multiplex.dataaccess.dao.SessaoDao;
import multiplex.model.Filme;
import multiplex.model.Localizacao;
import multiplex.model.Sala;
import multiplex.model.SalaTipo;
import multiplex.model.Sessao;

public class SessaoDaoTeste implements IDaoTeste{
	
	public void run(){
		SaveTeste();
		GetAndUpdateTeste();
		RemoveTeste();
		SaveTeste();
		CascadeTeste();
	}
	
	private void SaveTeste(){
		LocalizacaoDao localizacaoDao = new LocalizacaoDao();
		SalaDao salaDao = new SalaDao();
		SessaoDao sessaoDao = new SessaoDao();
		Localizacao localizacao = new Localizacao();
		localizacao.setNome("Multiplex Maranguape");
		localizacao.setLugarMarcado(true);
		localizacao.setCidade("Maranguape");
		localizacaoDao.save(localizacao);
		localizacao = localizacaoDao.getAll().get(0);
		Sala sala = new Sala();
		sala.setSalaTipo(SalaTipo.TEATHER);
		sala.setTecno3D(true);
		sala.setLocalizacao(localizacao);
		salaDao.save(sala);
		sala = salaDao.getAll().get(0);
		
		// CTRL+C + CTRL+V de Filmes Dao
		FilmeDao filmeDAO = new FilmeDao();
		Filme filme = new Filme();
		Calendar calendar = Calendar.getInstance();
		calendar.set(2010,10,01);
		filme.setAno(calendar);
		filme.setDestaque(true);
		filme.setDistribuidora("Disney");
		calendar = Calendar.getInstance();
		calendar.set(2010,10,05);
		filme.setDuracao(calendar);
		filme.setElenco("Robert de Niro");
		filme.setIndicacaoEtaria(16);
		filme.setLocalProducao("Bósnia");
		filme.setNome("A volta dos que não foram");
		filme.setNomeOriginal("The back of the one who not went");
		filme.setTipoFilme("Drama");
		filme.setSite("www.qualquercoisa.com");
		filme.setProdutores("Hessel");
		filme.setDirecao("Samir Elias Rossi");
		filmeDAO.save(filme);
		filme = filmeDAO.getAll().get(0);
		
		Sessao sessao = new Sessao();
		sessao.setFilme(filme);
		sessao.setSala(sala);
		sessao.setDataInicio(Calendar.getInstance());
		
		sessaoDao.save(sessao);
		sessao = new Sessao();
		sessao.setFilme(filme);
		sessao.setSala(sala);
		calendar = Calendar.getInstance();
		calendar.add(Calendar.DAY_OF_MONTH, 1);
		sessao.setDataInicio(calendar);
		sessaoDao.save(sessao);
		System.out.println("Sessões salvas com sucesso!");
	}
	private void GetAndUpdateTeste(){
		// mais uma sala
		Sala sala =new Sala();
		sala.setSalaTipo(SalaTipo.HALL);
		sala.setTecno3D(true);
		LocalizacaoDao localizacaoDao = new LocalizacaoDao();
		sala.setLocalizacao(localizacaoDao.getAll().get(0));
		SalaDao salaDao = new SalaDao();
		salaDao.save(sala);
		// atualizar id desta sala
		sala = (salaDao.getAll().get(0).getSalaTipo()==SalaTipo.HALL) ? salaDao.getAll().get(0) : 
				salaDao.getAll().get(1);
		
		// obter sessão
		SessaoDao sessaoDao = new SessaoDao();
		Sessao sessao = sessaoDao.getAll().get(0);
		// alterar sala da sessão
		sessao.setSala(sala);
		sessaoDao.save(sessao);
		System.out.println("Sessão recuperada e atualizada com sucesso");
		
		// outros testes
		sessaoDao.getAllFromSala(sala);
	}
	
	private void RemoveTeste() {
		LocalizacaoDao localizacaoDAO = new LocalizacaoDao();
		SalaDao salaDao = new SalaDao();
		SessaoDao sessaoDao = new SessaoDao();
		FilmeDao filmeDao = new FilmeDao();
		List<Sessao> sessoes = sessaoDao.getAll();
		for (Sessao sessao : sessoes) {
			sessaoDao.remove(sessao);
		}
		List<Sala> salas = salaDao.getAll();
		for (Sala sala : salas) {
			salaDao.remove(sala);
		}
		List<Localizacao> localizacoes = localizacaoDAO.getAll();
		for (Localizacao localizacao : localizacoes) {
			localizacaoDAO.remove(localizacao);
		}
		System.out.println("Sessoes deletadas com sucesso!");
		List<Filme> filmes = filmeDao.getAll();
		for (Filme filme : filmes) {
			filmeDao.remove(filme);
		}
		System.out.println("Filmes temporariamente criados no teste deletados...");
	}
	
	// executar depois de SaveTeste
	private void CascadeTeste() {
		LocalizacaoDao localizacaoDAO = new LocalizacaoDao();
		List<Localizacao> localizacoes = localizacaoDAO.getAll();
		for (Localizacao localizacao : localizacoes) {
			localizacaoDAO.remove(localizacao);
		}
		System.out.println("Sessoes deletadas com sucesso por castateamento (CASCADE ALL)!");
		FilmeDao filmeDao = new FilmeDao();
		List<Filme> filmes = filmeDao.getAll();
		for (Filme filme : filmes) {
			filmeDao.remove(filme);
		}
		System.out.println("Filmes temporariamente criados no teste deletados...");
		
	}
	
}
